package qc.module.ehs.api.controller;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import qc.common.core.enums.EhsTaskCategoryTypeEnum;
import qc.common.core.exception.QCPromptException;
import qc.common.core.utils.DateUtil;
import qc.module.ehs.dto.board.*;
import qc.module.ehs.entity.EhsOrg;
import qc.module.ehs.service.EhsBoardService;
import qc.module.ehs.service.EhsOrgService;
import qc.module.platform.dto.dept.DeptSimpleDto;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * EhsBoardController
 * @author QuCheng Tech
 * @since 2024/12/13
 */
@RestController
@RequestMapping("/board")
public class EhsBoardController {

    @Autowired
    private EhsBoardService service;

    @Autowired
    private EhsOrgService orgService;

    @Autowired
    HttpServletRequest request;

    @Autowired
    private RestTemplatePlatform restTemplatePlatform;

    /**
     * 获取组织最新安全状态；
     * @param id 组织机构代码
     * @return qc.module.ehs.dto.board.EhsBoardOrgLatestStatusDTO
     * @author QuCheng Tech
     * @since 2024/12/13
     */
    @GetMapping("/latest")
    public EhsBoardOrgLatestStatusDTO getOrgLatestStatusByParam(@RequestParam String id) throws QCPromptException {
        //1.查询条件有效性验证
        if (StringUtils.isBlank(id))
            throw new QCPromptException("查询组织机构代码不能为空");
        return service.getOrgLatestStatus(id);
    }

    /**
     * 获取组织最新安全状态；
     * @param id 组织机构代码
     * @return qc.module.ehs.dto.board.EhsBoardOrgLatestStatusDTO
     * @author QuCheng Tech
     * @since 2024/12/13
     */
    @GetMapping("/latest/{id}")
    public EhsBoardOrgLatestStatusDTO getOrgLatestStatusByPath(@PathVariable String id) throws QCPromptException {
        //1.查询条件有效性验证
        if (StringUtils.isBlank(id))
            throw new QCPromptException("查询组织机构代码不能为空");
        return service.getOrgLatestStatus(id);
    }

    /**
     * 统计指定时间段内组织的安全生产看板数据；
     *
     * @param dto 查询条件
     * @return java.util.List<qc.module.ehs.dto.board.EhsBoardQueryConditionDto>
     * @author QuCheng Tech
     * @since 2024/12/13
     */
    @RequestMapping(value = "/org", method = {RequestMethod.GET, RequestMethod.POST})
    public EhsBoardOrgQueryResultDto stsOrg(@RequestBody EhsBoardQueryConditionDto dto) throws QCPromptException {
        //1.查询条件有效性验证
        if (dto == null)
            throw new QCPromptException("查询条件对象不能为空");
        if (StringUtils.isBlank(dto.getOrgcode()))
            throw new QCPromptException("查询条件中的组织机构代码不能为空");
        if (StringUtils.isBlank(dto.getBegintm()))
            throw new QCPromptException("查询条件中的起始时间不能为空");
        if (StringUtils.isBlank(dto.getEndtm()))
            throw new QCPromptException("查询条件中的截止时间不能为空");

        //查询时间处理
        Date beginDate = null;
        Date endDate = null;
        if (StringUtils.isNotBlank(dto.getBegintm())) {
            try {
                beginDate = DateUtil.parseDate(dto.getBegintm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的开始日期转换错误");
            }
        }
        if (StringUtils.isNotBlank(dto.getEndtm())) {
            try {
                endDate = DateUtil.parseDate(dto.getEndtm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的截止日期转换错误");
            }
        }
        if (beginDate == null)
            throw new QCPromptException("统计的开始日期不能为空");
        if (endDate == null)
            throw new QCPromptException("统计的截止日期不能为空");

        //查询条件中开始日期不能超过截止日期
        if (endDate.before(beginDate))
            throw new QCPromptException("查询条件中开始日期不能超过截止日期");

        //增加判断时间的有效性：开始时间不能大于当前时间，截止时间如果大于当前时间默认为当前时间（不将未发生的时间段内的数据加入统计结果，否则会导致任务数量错误）
        Date today = DateUtil.getTodayDate();//获取今日日期
        if (beginDate.after(today))
            throw new QCPromptException("统计的开始日期不能超过当前日期");
        if (endDate.after(today))
            endDate = today;

        return service.queryStsOrg(dto.getOrgcode(), beginDate, endDate);
    }

    /**
     * 查询指定部门的下一级部门看板数据；返回下一级部门集合；
     * @param dto 查询条件
     * @return java.util.List<qc.module.ehs.dto.board.EhsBoardDataItemDto>
     * @author QuCheng Tech
     * @since 2024/12/13
     */
    @RequestMapping(value = "/childs", method = {RequestMethod.GET, RequestMethod.POST})
    public List<EhsBoardDataItemDto> stsChildDepts(@RequestBody EhsBoardQueryConditionDto dto) throws QCPromptException {
        //1.查询条件有效性验证
        if (dto == null)
            throw new QCPromptException("查询条件对象不能为空");
        if (StringUtils.isBlank(dto.getOrgcode()))
            throw new QCPromptException("查询条件中的组织机构代码不能为空");
        if (StringUtils.isBlank(dto.getBegintm()))
            throw new QCPromptException("查询条件中的起始时间不能为空");
        if (StringUtils.isBlank(dto.getEndtm()))
            throw new QCPromptException("查询条件中的截止时间不能为空");

        //查询时间处理
        Date beginDate = null;
        Date endDate = null;
        if (StringUtils.isNotBlank(dto.getBegintm())) {
            try {
                beginDate = DateUtil.parseDate(dto.getBegintm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的开始日期转换错误");
            }
        }
        if (StringUtils.isNotBlank(dto.getEndtm())) {
            try {
                endDate = DateUtil.parseDate(dto.getEndtm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的截止日期转换错误");
            }
        }
        if (beginDate == null)
            throw new QCPromptException("统计的开始日期不能为空");
        if (endDate == null)
            throw new QCPromptException("统计的截止日期不能为空");
        //查询条件中开始日期不能超过截止日期
        if (endDate.before(beginDate))
            throw new QCPromptException("查询条件中开始日期不能超过截止日期");
        //增加判断时间的有效性：开始时间不能大于当前时间，截止时间如果大于当前时间默认为当前时间（不将未发生的时间段内的数据加入统计结果，否则会导致任务数量错误）
        Date today = DateUtil.getTodayDate();//获取今日日期
        if (beginDate.after(today))
            throw new QCPromptException("统计的开始日期不能超过当前日期");
        if (endDate.after(today))
            endDate = today;

        EhsOrg org = orgService.getEntity(dto.getOrgcode());
        HashMap<Integer, String> deptIdAndNames = new HashMap<>();
        //在此判断传入的组织机构代码正确，并获取对应的部门ID；根据部门ID获取下一级部门集合(将下一级部门ID和名称作为参数传入service)
        if (Objects.nonNull(org)) {
            //调用platform中的/qc/dept/deptchildslist接口获取，从返回结果中获取当前指定部门的下一级部门集合
            List<DeptSimpleDto> resultDto = restTemplatePlatform.getDeptChildsList(dto.getDeptid());

            if (resultDto != null && !resultDto.isEmpty()) {
                resultDto.stream()
                        .filter(dept -> dept.getLevel() == 0X1) // 仅当 level == 0x1 时才存入,获取下级部门
                        .forEach(dept -> deptIdAndNames.put(dept.getId(), dept.getName()));//将 id 和 name 存入 deptIdAndNames
            } else {
                //指定部门无下一级部门，提示错误
                throw new QCPromptException("指定部门无下一级部门");
            }
        } else {
            //组织机构不存在
            throw new QCPromptException("查询组织机构不存在");
        }
        return service.queryChildDepts(dto.getOrgcode(), deptIdAndNames, beginDate, endDate);
    }

    /**
     * 获取指定单元的最新安全状态
     *
     * @param id 单元ID
     * @return qc.module.ehs.dto.board.EhsBoardOrgLatestStatusDTO
     * @author QuCheng Tech
     * @since 2025/6/12
     */
    @GetMapping("/unitlatest/{id}")
    public EhsBoardOrgLatestStatusDTO getUnitLatestStatusByPath(@PathVariable String id) throws QCPromptException {
        //1.查询条件有效性验证
        if (StringUtils.isBlank(id)) {
            throw new QCPromptException("获取最新安全状态的单元ID不能为空");
        }
        return service.getUnitLatestStatus(id);
    }

    /**
     * 获取指定单元的最新安全状态
     *
     * @param id 单元ID
     * @return qc.module.ehs.dto.board.EhsBoardOrgLatestStatusDTO
     * @author QuCheng Tech
     * @since 2025/6/12
     */
    @GetMapping("/unitlatest")
    public EhsBoardOrgLatestStatusDTO getUnitLatestStatusByParam(@RequestParam String id) throws QCPromptException {
        if (StringUtils.isBlank(id)) {
            throw new QCPromptException("获取最新安全状态的单元ID不能为空");
        }
        return service.getUnitLatestStatus(id);
    }

    /**
     * 查统计指定时间段内指定单元的安全生产看板数据；
     *
     * @param dto 查询条件
     * @return java.util.List<qc.module.ehs.dto.board.EhsBoardQueryConditionDto>
     * @author QuCheng Tech
     * @since 2024/12/13
     */
    @RequestMapping(value = "/unit", method = {RequestMethod.GET, RequestMethod.POST})
    public EhsBoardUnitQueryResultDto stsUnit(@RequestBody EhsBoardUnitQueryConditionDto dto) throws QCPromptException {
        //1.查询条件有效性验证
        if (dto == null)
            throw new QCPromptException("查询条件对象不能为空");
        if (StringUtils.isBlank(dto.getUnitid()))
            throw new QCPromptException("查询条件中的单元ID不能为空");
        if (StringUtils.isBlank(dto.getBegintm()))
            throw new QCPromptException("查询条件中的起始时间不能为空");
        if (StringUtils.isBlank(dto.getEndtm()))
            throw new QCPromptException("查询条件中的截止时间不能为空");

        //查询时间处理
        Date beginDate = null;
        Date endDate = null;
        if (StringUtils.isNotBlank(dto.getBegintm())) {
            try {
                beginDate = DateUtil.parseDate(dto.getBegintm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的开始日期转换错误");
            }
        }
        if (StringUtils.isNotBlank(dto.getEndtm())) {
            try {
                endDate = DateUtil.parseDate(dto.getEndtm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的截止日期转换错误");
            }
        }
        if (beginDate == null)
            throw new QCPromptException("统计的开始日期不能为空");
        if (endDate == null)
            throw new QCPromptException("统计的截止日期不能为空");

        //查询条件中开始日期不能超过截止日期
        if (endDate.before(beginDate))
            throw new QCPromptException("查询条件中开始日期不能超过截止日期");

        //增加判断时间的有效性：开始时间不能大于当前时间，截止时间如果大于当前时间默认为当前时间（不将未发生的时间段内的数据加入统计结果，否则会导致任务数量错误）
        Date today = DateUtil.getTodayDate();//获取今日日期
        if (beginDate.after(today))
            throw new QCPromptException("统计的开始日期不能超过当前日期");
        if (endDate.after(today))
            endDate = today;

        return service.queryStsUnit(dto.getUnitid(), beginDate, endDate);
    }

    /**
     * 统计指定时间段内组织的各单元任务数据
     *
     * @param dto 查询条件
     * @return qc.module.ehs.dto.board.EhsBoardUnitQueryResultDto
     * @author QuCheng Tech
     * @since 2025/6/13
     */
    @RequestMapping(value = "/unittasks", method = {RequestMethod.GET, RequestMethod.POST})
    public List<EhsBoardTaskQueryResultItemDto> stsOrgUnitTasks(@RequestBody EhsBoardTaskQueryConditionDto dto) throws QCPromptException {
        //1.查询条件有效性验证
        if (dto == null)
            throw new QCPromptException("查询条件对象不能为空");
        if (StringUtils.isBlank(dto.getOrgcode()))
            throw new QCPromptException("查询条件中的组织机构代码不能为空");
        if (StringUtils.isBlank(dto.getBegintm()))
            throw new QCPromptException("查询条件中的起始时间不能为空");
        if (StringUtils.isBlank(dto.getEndtm()))
            throw new QCPromptException("查询条件中的截止时间不能为空");

        //查询时间处理
        Date beginDate = null;
        Date endDate = null;
        if (StringUtils.isNotBlank(dto.getBegintm())) {
            try {
                beginDate = DateUtil.parseDate(dto.getBegintm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的开始日期转换错误");
            }
        }
        if (StringUtils.isNotBlank(dto.getEndtm())) {
            try {
                endDate = DateUtil.parseDate(dto.getEndtm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的截止日期转换错误");
            }
        }
        if (beginDate == null)
            throw new QCPromptException("统计的开始日期不能为空");
        if (endDate == null)
            throw new QCPromptException("统计的截止日期不能为空");

        //查询条件中开始日期不能超过截止日期
        if (endDate.before(beginDate))
            throw new QCPromptException("查询条件中开始日期不能超过截止日期");

        //增加判断时间的有效性：开始时间不能大于当前时间，截止时间如果大于当前时间默认为当前时间（不将未发生的时间段内的数据加入统计结果，否则会导致任务数量错误）
        Date today = DateUtil.getTodayDate();//获取今日日期
        if (beginDate.after(today))
            throw new QCPromptException("统计的开始日期不能超过当前日期");
        if (endDate.after(today))
            endDate = today;

        //获取任务大类
        List<EhsTaskCategoryTypeEnum> taskCategoryTypes = new ArrayList<>();
        if (dto.getTasktype() > 0x0) {
            for (EhsTaskCategoryTypeEnum item : EhsTaskCategoryTypeEnum.values()) {
                if ((int) (dto.getTasktype() & item.getIndex()) == item.getIndex()) {
                    taskCategoryTypes.add(item);
                }
            }
        }

        return service.stsOrgUnitTasks(dto.getOrgcode(), beginDate, endDate, taskCategoryTypes);
    }

    /**
     * 获取组织各单元的危险源看板数据-getOrgUnitHazards
     * 统计组织中各单元的危险源（可以指定第一类或第二类）统计数量；
     * 每个单元统计数量包含：总数、一般/重大数量、各风险等级数量；
     *
     * @param dto 查询条件
     * @return java.util.List<qc.module.ehs.dto.board.EhsBoardOrgUnitHazardsQueryResultItemDto>
     * @author QuCheng Tech
     * @since 2025/6/9
     */
    @RequestMapping(value = "/unithazards", method = {RequestMethod.GET, RequestMethod.POST})
    public List<EhsBoardOrgUnitHazardsQueryResultItemDto> getOrgUnitHazards(@RequestBody EhsBoardOrgUnitHazardsQueryConditionDto dto) throws QCPromptException {
        if (dto == null)
            throw new QCPromptException("查询条件对象不能为空");
        if (StringUtils.isBlank(dto.getOrgcode()))
            throw new QCPromptException("查询条件中的组织代码不能为空");

        return service.getOrgUnitHazards(dto.getOrgcode(), dto.getFlag());
    }
}
